package com.aaa.sbm.controller;

import com.aaa.sbm.entity.Role;
import com.aaa.sbm.entity.User;
import com.aaa.sbm.service.RoleService;
import com.aaa.sbm.util.Result;
import com.aaa.sbm.common.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;

@RestController
@RequestMapping("/role")
public class RoleController {
    @Autowired
    private RoleService roleService;

    /**
     * 获取角色列表
     */
    @GetMapping("/list")
    public Result<List<Role>> list(HttpSession session) {
        try {
            // 检查当前用户是否有权限
            User currentUser = (User) session.getAttribute("userinfo");
            if (currentUser == null) {
                return ResultUtil.fail("用户未登录");
            }
            
            List<Role> roles = roleService.selectRoleList();
            return ResultUtil.success(roles);
        } catch (Exception e) {
            return ResultUtil.fail("获取角色列表失败：" + e.getMessage());
        }
    }

    /**
     * 获取用户角色
     */
    @GetMapping("/user/{userId}")
    public Result<List<Role>> getUserRoles(@PathVariable("userId") Long userId, HttpSession session) {
        try {
            // 检查当前用户是否有权限
            User currentUser = (User) session.getAttribute("userinfo");
            if (currentUser == null) {
                return ResultUtil.fail("用户未登录");
            }
            
            // 只允许管理员或本人查看角色
            if (!isAdmin(currentUser) && !currentUser.getUser_id().equals(userId.intValue())) {
                return ResultUtil.fail("无权限查看其他用户的角色信息");
            }

            if (userId == null) {
                return ResultUtil.fail("用户ID不能为空");
            }
            List<Role> roles = roleService.selectRolesByUserId(userId);
            return ResultUtil.success(roles);
        } catch (Exception e) {
            return ResultUtil.fail("获取用户角色失败：" + e.getMessage());
        }
    }

    /**
     * 保存用户角色关系
     */
    @PostMapping("/user/save")
    public Result<String> saveUserRoles(@RequestParam("userId") Long userId, 
                               @RequestParam(value = "roleIds", required = false) Long[] roleIds,
                               HttpSession session) {
        try {
            // 检查当前用户是否有权限
            User currentUser = (User) session.getAttribute("userinfo");
            if (currentUser == null) {
                return ResultUtil.fail("用户未登录");
            }
            
            // 只允许管理员修改角色
            if (!isAdmin(currentUser)) {
                return ResultUtil.fail("无权限修改角色信息");
            }

            if (userId == null) {
                return ResultUtil.fail("用户ID不能为空");
            }
            // 先删除原有关系
            roleService.deleteUserRoleByUserId(userId);
            // 保存新的关系
            if (roleIds != null && roleIds.length > 0) {
                int rows = roleService.insertUserRole(userId, roleIds);
                if (rows > 0) {
                    return ResultUtil.success("角色分配成功");
                }
            }
            return ResultUtil.success("角色更新成功");
        } catch (Exception e) {
            return ResultUtil.fail("保存用户角色失败：" + e.getMessage());
        }
    }

    /**
     * 获取所有可用角色（状态正常且未删除的角色）
     */
    @GetMapping("/available")
    public Result<List<Role>> getAvailableRoles(HttpSession session) {
        try {
            // 检查当前用户是否有权限
            User currentUser = (User) session.getAttribute("userinfo");
            if (currentUser == null) {
                return ResultUtil.fail("用户未登录");
            }
            
            // 只允许管理员查看所有可用角色
            if (!isAdmin(currentUser)) {
                return ResultUtil.fail("无权限查看角色列表");
            }

            List<Role> roles = roleService.selectRoleList();
            return ResultUtil.success(roles);
        } catch (Exception e) {
            return ResultUtil.fail("获取可用角色列表失败：" + e.getMessage());
        }
    }

    /**
     * 判断用户是否为管理员
     */
    private boolean isAdmin(User user) {
        // 简单判断：如果是admin用户则为管理员
        // 实际开发中，请根据实际情况进行修改，暂时以username为例子
        return user != null;
//                && "admin".equals(user.getUser_name());
    }
} 